package interfaces;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JButton;

import controle.Controle;

/**
 * 
 * Classe InterfaceJogo.java que representa a interface que conterá o jogo em
 * si, ou seja com o placar, fase, nome do jogador e projéteis a serem lançados.
 * 
 * @desc Projeto BombarJ
 * @author Simone Carneiro Streitenberger 11888 CCO2003
 * @author Thiago Nascimento Comicio 11889 CCO2003
 * @professor Edison de Jesus
 * @disciplina Computação Gráfica 2 - CCO812
 * 
 */
public class InterfaceJogo extends JPanel implements ActionListener {

	private static final long serialVersionUID = 1L;

	// objeto de controle do jogo
	private Controle controle;

	/* componentes da interface de jogo */
	private JLabel lblFase = null;

	// painel onde se passará o jogo
	private PainelFase painelFase = null;

	private JLabel lblTitJogador = null;

	private JLabel lblNomeJogador = null;

	private JLabel lblTitPontos = null;

	private JLabel lblPontos = null;

	private JLabel lblTitProjeteis = null;

	private JButton btnSair = null;

	private JLabel lblProjeteisExtras = null;

	private JLabel lblPro[] = null;

	private JLabel lblProExtra[] = null;

	/**
	 * 
	 * Construtor da classe InterfaceJogo.java
	 * 
	 */
	public InterfaceJogo() {
		super();
		inicializar();
	}

	/**
	 * 
	 * Este método inicializa a interface de jogo
	 * 
	 */
	private void inicializar() {

		// Setando os labels que contém a indicação de projéteis
		lblPro = new JLabel[7];

		for (int i = 0; i < 7; i++) {
			lblPro[i] = new JLabel();
			lblPro[i].setBounds(new java.awt.Rectangle(636 + i * 20, 291, 21,
					16));
			lblPro[i].setText("•");
			lblPro[i].setForeground(new java.awt.Color(0, 0, 153));
			lblPro[i].setFont(new java.awt.Font("Dialog", java.awt.Font.BOLD,
					24));
		}

		// Setando os labels que contém a indicação de projéteis extras
		lblProExtra = new JLabel[5];
		for (int i = 0; i < 5; i++) {
			lblProExtra[i] = new JLabel();
			lblProExtra[i].setBounds(new java.awt.Rectangle(656 + i * 20, 391,
					21, 16));
			lblProExtra[i].setText("•");
			lblProExtra[i].setForeground(new java.awt.Color(0, 0, 153));
			lblProExtra[i].setFont(new java.awt.Font("Dialog",
					java.awt.Font.BOLD, 24));
		}

		// setando as características dos componentes do painel
		lblProjeteisExtras = new JLabel();
		lblProjeteisExtras.setBounds(new java.awt.Rectangle(633, 350, 146, 34));
		lblProjeteisExtras.setFont(new java.awt.Font("Dialog",
				java.awt.Font.BOLD, 24));
		lblProjeteisExtras
				.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
		lblProjeteisExtras
				.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
		lblProjeteisExtras.setForeground(java.awt.Color.black);
		lblProjeteisExtras.setText("Extras");

		lblTitProjeteis = new JLabel();
		lblTitProjeteis.setBounds(new java.awt.Rectangle(633, 250, 146, 34));
		lblTitProjeteis.setFont(new java.awt.Font("Dialog", java.awt.Font.BOLD,
				24));
		lblTitProjeteis
				.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
		lblTitProjeteis
				.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
		lblTitProjeteis.setForeground(java.awt.Color.black);
		lblTitProjeteis.setText("Projéteis");
		lblPontos = new JLabel();
		lblPontos.setBounds(new java.awt.Rectangle(633, 175, 146, 34));
		lblPontos.setForeground(new java.awt.Color(0, 0, 153));
		lblPontos.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
		lblPontos.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
		lblPontos.setFont(new java.awt.Font("Dialog", java.awt.Font.BOLD, 18));
		lblPontos.setText("JLabel");
		lblTitPontos = new JLabel();
		lblTitPontos.setBounds(new java.awt.Rectangle(633, 150, 146, 34));
		lblTitPontos
				.setFont(new java.awt.Font("Dialog", java.awt.Font.BOLD, 24));
		lblTitPontos
				.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
		lblTitPontos.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
		lblTitPontos.setForeground(java.awt.Color.black);
		lblTitPontos.setText("Pontuação");
		lblNomeJogador = new JLabel();
		lblNomeJogador.setBounds(new java.awt.Rectangle(633, 75, 146, 34));
		lblNomeJogador
				.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
		lblNomeJogador
				.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
		lblNomeJogador.setFont(new java.awt.Font("Dialog", java.awt.Font.BOLD,
				18));
		lblNomeJogador.setForeground(new java.awt.Color(0, 0, 153));
		lblNomeJogador.setText("JLabel");
		lblTitJogador = new JLabel();
		lblTitJogador.setBounds(new java.awt.Rectangle(633, 50, 146, 34));
		lblTitJogador.setFont(new java.awt.Font("Dialog", java.awt.Font.BOLD,
				24));
		lblTitJogador
				.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
		lblTitJogador.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
		lblTitJogador.setForeground(java.awt.Color.black);
		lblTitJogador.setText("Jogador");
		lblFase = new JLabel();
		lblFase.setText("Fase");
		lblFase.setFont(new java.awt.Font("Dialog", java.awt.Font.BOLD, 36));
		lblFase.setForeground(java.awt.Color.black);
		lblFase.setBounds(new java.awt.Rectangle(15, -4, 200, 60));

		// setando o a imagem de background
		JLabel background = new JLabel(new ImageIcon("imagens/backFase.jpg"));
		background.setBounds(14, 54, 600, 500);

		// setando as características da interface de jogo
		this.setLayout(null);
		this.setPreferredSize(new java.awt.Dimension(800, 600));
		this.setFont(new java.awt.Font("Dialog", java.awt.Font.PLAIN, 24));
		this.setBounds(new java.awt.Rectangle(0, 0, 800, 600));

		// adicionando os componentes a interface
		this.add(lblFase, null);
		this.add(getPainelFase(), null);
		this.add(lblTitJogador, null);
		this.add(lblNomeJogador, null);
		this.add(lblPontos, null);
		this.add(lblTitProjeteis, null);
		this.add(getBtnSair(), null);
		this.add(lblTitPontos, null);

		this.add(background);
		this.add(lblProjeteisExtras, null);

		for (int i = 0; i < 7; i++) {
			this.add(lblPro[i], null);
		}

		for (int i = 0; i < 5; i++) {
			this.add(lblProExtra[i], null);
		}
	}

	/**
	 * 
	 * 
	 * Método que tem por função criar e retornar o painel de fases
	 * 
	 * @return Painel das fases.
	 * 
	 */
	public PainelFase getPainelFase() {
		if (painelFase == null) {
			// cria o painel caso ele não tenha sido criado ainda
			painelFase = new PainelFase();
			painelFase.setBounds(new java.awt.Rectangle(14, 54, 600, 500));
			painelFase.setOpaque(false);
		}

		return painelFase;
	}

	/**
	 * 
	 * Método que tem por função conectar a interface de jogo com o objeto que
	 * controla o jogo
	 * 
	 * @param controle
	 *            Objeto que controla o jogo.
	 * 
	 */
	public void conectaControle(Controle controle) {
		this.controle = controle;
	}

	/**
	 * 
	 * Método que tem por função indicar que um projétil já foi usado
	 * 
	 * @param projetil
	 *            Numeração do projétil utilizado
	 * 
	 */
	public void setProjetilUsado(int projetil) {
		lblPro[projetil - 1].setForeground(Color.RED);
	}

	/**
	 * 
	 * Método que tem por função indicar que um projétil já foi usado
	 * 
	 * @param projetil
	 *            Numeração do projétil extra utilizado
	 * 
	 */
	public void setProjetilExtraUsado(int projetil) {
		lblProExtra[projetil - 1].setForeground(Color.RED);
	}

	/**
	 * 
	 * Método que tem por função setar as cores iniciais das indicações dos
	 * projéteis extra
	 * 
	 */
	public void setProjeteisExtra() {
		for (int i = 0; i < 5; i++)
			lblProExtra[i].setForeground(new Color(0, 0, 153));
	}

	/**
	 * 
	 * Método que tem por função setar as cores iniciais das indicações dos
	 * projéteis
	 * 
	 */
	public void setProjeteisFase() {
		for (int i = 0; i < 7; i++)
			lblPro[i].setForeground(new Color(0, 0, 153));
	}

	/**
	 * 
	 * Método que tem por função setar o nome do jogador na interface de jogo
	 * 
	 * @param nomeJogador
	 *            Nome do jogador infromado pelo próprio jogador.
	 * 
	 */
	public void setNomeJogador(String nomeJogador) {
		this.lblNomeJogador.setText(nomeJogador);
	}

	/**
	 * 
	 * Método que tem por função exibir os pontos na interface de forma
	 * formatada
	 * 
	 * @param pontos
	 *            Pontos do jogador
	 * 
	 */
	public void setPontos(int pontos) {
		String dispPontos = pontos + "";

		// formata os pontos a serem exibidos
		if (pontos / 10 == 0)
			dispPontos = "00" + dispPontos;
		else if (pontos / 100 == 0) {
			dispPontos = "0" + dispPontos;
		}

		this.lblPontos.setText(dispPontos);
	}

	/**
	 * 
	 * Método que tem por função exibir a fase atual
	 * 
	 * @param fase
	 *            Fase atual
	 * 
	 */
	public void setFase(int fase) {
		this.lblFase.setText("Fase " + fase);
	}

	/**
	 * 
	 * Método que tem por função criar o botão de sair
	 * 
	 * @return O botão de sair
	 * 
	 */
	private JButton getBtnSair() {
		if (btnSair == null) {
			btnSair = new JButton();
			btnSair.setBounds(new java.awt.Rectangle(661, 534, 92, 20));
			btnSair.setText("Sair");
			btnSair.setForeground(java.awt.Color.black);
			btnSair.setContentAreaFilled(false);
			btnSair.addActionListener(this);
		}
		return btnSair;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
	 */
	public void actionPerformed(ActionEvent evento) {
		if (evento.getSource() == btnSair) {

			// verifica se foi pressionado o botão de sair e exibe uma pergunta
			// se o usuário deseja mesmo sair
			int resposta = JOptionPane.showConfirmDialog(null,
					"Tem certeza que deseja sair?", "Retornar à tela inicial",
					JOptionPane.YES_NO_OPTION);

			if (resposta == JOptionPane.YES_OPTION) {
				controle.apresentaTelaInicial();
			} else {
				controle.focaInterface();
			}

		}
	}

}
